<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta name="generator" content="HTML Tidy for Linux/x86 (vers 1st November 2003), see www.w3.org"/>
    <title>JavaScript: Basics</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="copyright" content="Copyright &#169; 2005-2010 W3C (MIT, ERCIM, Keio)"/>
    <meta name="duration" content="5"/>
    <meta name="font-size-adjustment" content="-2"/>

    <link rel="stylesheet" href="styles/slidy.css" type="text/css"/>
    <link rel="stylesheet" href="styles/w3c-blue.css" type="text/css"/>
	<script type="text/javascript" src="scripts/slidy.js" charset="utf-8">//</script>

    <link type="text/css" rel="stylesheet" href="styles/shCoreDefault.css"/>
    <script type="text/javascript" src="scripts/shCore.js"></script>
    <script type="text/javascript" src="scripts/shBrushJScript.js"></script>
    <script type="text/javascript" src="scripts/shBrushRuby.js"></script>
    <script type="text/javascript" src="scripts/shBrushJava.js"></script>

    <link type="text/css" rel="stylesheet" href="styles/presentation.css"/>
    <script type="text/javascript" src="scripts/presentation.js"></script>
</head>


<body>
<div class="background">
    <img alt="" id="head-icon" src="graphics/icon-blue.png"/>
</div>

<div class="background slanty">
</div>

<div class="slide cover title">
    <img class="hidden" src="graphics/bullet.png" alt=""/>
    <img class="hidden" src="graphics/fold.gif" alt=""/>
    <img class="hidden" src="graphics/unfold.gif" alt=""/>
    <img class="hidden" src="graphics/fold-dim.gif" alt=""/>
    <img class="hidden" src="graphics/nofold-dim.gif" alt=""/>
    <img class="hidden" src="graphics/unfold-dim.gif" alt=""/>
    <img class="hidden" src="graphics/bullet-fold.gif" alt=""/>
    <img class="hidden" src="graphics/bullet-unfold.gif" alt=""/>
    <img class="hidden" src="graphics/bullet-fold-dim.gif" alt=""/>
    <img class="hidden" src="graphics/bullet-nofold-dim.gif" alt=""/>
    <img class="hidden" src="graphics/bullet-unfold-dim.gif" alt=""/>

    <h1>OOP and Design Pattern</h1>

    <div style="position: absolute; bottom: 20px;">
        <p>Alex Kolonitsky (Java)</p>
        <p><a href="http://javascript-learning-courses.googlecode.com/svn/trunk/Intermidiate-04-OOP.html">http://javascript-learning-courses.googlecode.com/svn/trunk/Intermidiate-04-OOP.html</a></p>
    </div>
</div>

<div class="slide">
    <h1>Content</h1>

    <ul>
        <li>Inheritance Problems and Solutions</li>
        <li>Functional Programing in JS</li>
        <li>Design Patterns</li>
        <li>OOP Principals</li>
    </ul>
</div>

<div class="slide">
    <h1>Content</h1>

    <ul class="content">
        <li class="current">Inheritance Problems and Solutions</li>
        <li>Functional Programing in JS</li>
        <li>Design Patterns</li>
        <li>OOP Principals</li>
    </ul>
</div>

<!-- Inheritance Problems -->
<div class="slide">
    <h1>Inheritance Problems</h1>

    <ul>
        <li>Всегда ли нам нужно наследование?</li>
        <li><a href="http://ru.wikipedia.org/wiki/Хрупкий_базовый_класс" rel="nofollow">Хрупкий базовый класс.</a></li>
        <li><a href="http://en.wikipedia.org/wiki/Yo-yo_problem">Yo-Yo problem.</a></li>
        <li><a href="http://ru.wikipedia.org/wiki/Принцип_подстановки_Лисков" rel="nofollow">Принцип подстановки Лисков</a></li>
        <li>Множественное наследование?</li>
    </ul>
</div>

<div class="slide">
    <h1>Хрупкий базовый класс</h1>

    <ul>
        <li>Mалейшие правки базового класса могут привнести ошибку в производные классы</li>
        <li>Любая успешная модификация базового класса требует предварительного изучения всего дерева наследования</li>
        <li class="solution">Замена наследования агрегацией.</li>
    </ul>
</div>

<div class="slide">
    <h1>Yo-Yo problem.</h1>

    <ul>
        <li>Чем глубже наследование, тем сложней отследить поведение.</li>
        <li class="solution"><a href="http://ru.wikipedia.org/wiki/Магическое_число_семь_плюс-минус_два" rel="nofollow">Магическое число семь плюс-минус два</a></li>
        <li class="solution">Замена наследования агрегацией.</li>
    </ul>
</div>

<div class="slide">
    <h1>Принцип подстановки Лисков.</h1>

    <p>Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.</p>

    <ul class="incremental">
        <li><a href="http://ru.wikipedia.org/wiki/Контрактное_программирование" rel="nofollow">Контрактное программирование</a></li>
        <li>TDD or <a href="http://ru.wikipedia.org/wiki/Аспектно-ориентированное_программирование" rel="nofollow">AOP</a></li>
    </ul>
</div>

<div class="slide">
    <h1>AOP</h1>

    
</div>

<div class="slide">
    <h1>AOP</h1>

    <p>Некоторую функциональность с помощью предложенных методов(ООП, процедуры, ...) невозможно выделить в отдельные сущности</p>

    <div style="font-size: 75%">
        <pre class="brush: java">
            public aspect ServletPerformanceMonitor {
                Object around(HttpRequest request)
                    : execution(* HttpServlet.do*(..)) && args(request,..){
                    long startTime = System.nanoTime();
                    Object retValue = proceed(request);
                    long endTime = System.nanoTime();
                    monitorAgent.record(request.getRequestURI(),
                                        endTime - startTime);
                    return retValue;
                }
            }
        </pre>
    </div>
</div>

<div class="slide">
    <h1>AOP in JS</h1>

    <p>Посредством функциональных аргументов, функцию можно легко декорировать и выполнить в некотором аспекте</p>

    <div style="font-size: 60%; margin-left: 1.5em;">
        <pre class="brush: js">
            // advice definition
            function inTransaction(action) {
              return function () {
                long startTime = new Date();
                Object retValue = action.apply(this, arguments);
                long endTime = new Date();
                monitorAgent.record(request.getRequestURI(),
                                    endTime - startTime);
                return retValue;
              };
            }

            // logic definition
            function createOrder() { ... }

            // add advice to createOrder function
            createOrder = inTransaction(createOrder);
        </pre>
    </div>
</div>

<div class="slide">
    <h1>Множественное наследование?</h1>

    <ul>
        <li><a href="http://ru.wikipedia.org/wiki/Проблема_ромба" rel="nofollow">Ромбовидное наследование</a></li>
        <li class="solution">Interfaces</li>
        <li class="solution">Mix-in</li>
    </ul>
</div>

<div class="slide">
    <h1>Mix-in</h1>

    <ul>
        <li>модуль - реализующий какое-либо чётко выделенное поведение</li>
        <li>Используется для уточнения поведения других классов, не предназначен для порождения самостоятельно используемых объектов</li>
    </ul>
</div>

<div class="slide">
    <h1>Mix-in в Ruby</h1>

    <pre class="brush: ruby">
        class Age
            include Comparable

            attr_accessor(:age)

            def <=>(cmp)
                @age <=> cmp.age
            end
        end
    </pre>
</div>

<div class="slide">
    <h1>Mix-in в JS</h1>

    <pre class="brush: js">
        function augment(receivingClass, givingClass) {
            for(methodName in givingClass.prototype) {
                if(!receivingClass.prototype[methodName]) {
                    receivingClass.prototype[methodName] = givingClass.prototype[methodName];
                }
            }
        }
    </pre>
</div>
<!-- Inheritance Problems End-->

<!-- TODO Functional Programming -->

<div class="slide">
    <h1>Content</h1>

    <ul class="content">
        <li class="done">Inheritance Problems and Solutions</li>
        <li class="current">Functional Programing in JS</li>
        <li>Design Patterns</li>
        <li>OOP Principals</li>
    </ul>
</div>

<div class="slide">
    <h1>Functional Programing</h1>

    <ul>
        <li>Каррирование</li>
        <li>Замыкание</li>
        <li>Функции обьекты - первого порядка.</li>
    </ul>
</div>

<div class="slide">
    <h1>Каррирование</h1>

    <p>Math...</p>
</div>

<div class="slide">
    <h1>Каррирование</h1>

    <pre class="brush: js">
        var add1 = add.curry(1);
        alert(add1(6));    // 7

        Function.prototype.curry = function (  ) {
            var args = arguments, that = this;
            return function (  ) {
                return that.apply(null, args.concat(arguments));
                // it is fake
            };
        };
    </pre>
</div>

<div class="slide">
    <h1>Functional Programing</h1>

    <p style="font-size: 50%; white-space: normal;">
-- Ты функциональщик! – прокричал Сергей на весь оупен-спейс-рум номер 14.
Комната притихла в ожидании развязки.</p>
<p style="font-size: 50%; white-space: normal;">
-- Я видел, как ты вчера вечером каррировал и декаррировал прямо за рабочим компьютером!
Неодобрительный ропот и возгласы удивления прокатились по комнате. Кто-то громким шепотом сказал “какой ужас, а я с ним за руку здоровался”.</p>
<p style="font-size: 50%; white-space: normal;">
-- Знаешь что, Сергей, – сказал Денис, вставая из-за рабочего стола, – любой нормальный мужчина, если у него всё в порядке, может позволить себе позаниматься функциональным программированием. Это естественно. Каждый хотя бы раз, да пробовал. Зачем только об этом кричать на всю комнату? Я же не кричу, что ты объектно-ориентированный!
Девушки захихикали, кто-то снова громко пробормотал “ну надо же, а по нему и не скажешь”.
<p style="font-size: 50%; white-space: normal;">
Присутствовавший при этом Игорь Матвеевич сильнее вжался в кресло. Только бы никто не узнал про его процедурные наклонности!
    </p>
</div>

<div class="slide">
    <h1>Content</h1>

    <ul class="content">
        <li class="done">Inheritance Problems and Solutions</li>
        <li class="done">Functional Programing in JS</li>
        <li class="current">Design Patterns</li>
        <li>OOP Principals</li>
    </ul>
</div>

<div class="slide">
    <h1>JS Patterns</h1>

    <ul>
        <li>Module Pattern</li>
        <li>Memoization</li>
    </ul>
</div>

<div class="slide">
    <h1>Module: Import</h1>

    <pre class="brush: js">
        (function ($, YAHOO) {
            // now have access to globals
            // jQuery (as $) and YAHOO in this code
        }(jQuery, YAHOO));
    </pre>
</div>

<div class="slide">
    <h1>Module: Export</h1>

    <pre class="brush: js">
        var MODULE = (function () {
            var my = {};
            var privateVariable = 1;

            function privateMethod() { ... }

            my.moduleProperty = 1;
            my.moduleMethod = function () { ... }

            return my;
        }());
    </pre>
</div>

<div class="slide">
    <h1>Module: Augmentation</h1>

    <pre class="brush: js">
        MODULE = (function (my) {
            my.anotherMethod = function () {
                // added method...
            };

            return my;
        }(MODULE));
    </pre>
</div>

<div class="slide">
    <h1>Module: Loose Augmentation</h1>

    <pre class="brush: js">
        var MODULE = (function (my) {
            // add capabilities...

            return my;
        }(MODULE || {}));
    </pre>
</div>

<div class="slide">
    <h1>Module: Tight Augmentation</h1>

    <pre class="brush: js">
        var MODULE = (function (my) {
            var oldModuleMethod = my.moduleMethod;

            my.moduleMethod = function () {
                // method override, has access to old through oldModuleMethod...
            };

            return my;
        }(MODULE));
    </pre>
</div>

<div class="slide">
    <h1>Module: Cloning and Inheritance</h1>

    <pre class="brush: js">
        var MODULE_TWO = (function (old) {
            var my = {};

            for (var key in old) {
                if (old.hasOwnProperty(key)) {
                    my[key] = old[key];
                }
            }

            var superModuleMethod = old.moduleMethod;
            my.moduleMethod = function () {
                // override method on the clone, access to super through superModuleMethod
            };

            return my;
        }(MODULE));
    </pre>
</div>

<div class="slide">
    <h1>Module: Cloning and Inheritance</h1>

    <pre class="brush: js">
        var MODULE_TWO = (function (old) {
            var my = inheritFrom(old); // or clone(old)

            var superModuleMethod = old.moduleMethod;
            my.moduleMethod = function () {
                // override method on the clone, access to super through superModuleMethod
            };

            return my;
        }(MODULE));
    </pre>
</div>

<div class="slide">
    <h1>Module</h1>

    <ul>
        <li>...</li>
        <li>Tight Augmentation</li>
        <li>Cloning and Inheritance</li>
        <li>Cross-File Private State</li>
        <li>Sub-modules</li>
        <li>...</li>
    </ul>

    <p><a href="http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth" rel="nofollow" target="_blank">Оригинальная статья по теме.</a></p>
</div>

<div class="slide">
    <h1>Memoization</h1>

    <div style="font-size: 55%">
        <pre class="brush: js">
            // Factory method.
            AjaxHandler.prototype.createXhrObject = function() {
                var methods = [
                    function() { return new XMLHttpRequest(); },
                    function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
                    function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
                ];

                for (var i = 0; i < methods.length; i++) {
                    try {
                        methods[i]();
                    } catch(e) {
                        continue;
                    }

                    // If we reach this point, method[i] worked.
                    this.createXhrObject = methods[i]; // Memoize the method.
                    return methods[i];
                }

                // If we reach this point, none of the methods worked.
                throw new Error('SimpleHandler: Could not create an XHR object.');
            };
        </pre>
    </div>
</div>

<div class="slide">
    <h1>Memoization</h1>

    <pre class="brush: js">
        // TODO sample from good part (fib)
    </pre>
</div>

<div class="slide">
    <h1>Design Patterns</h1>

    <ul>
        <li>Singleton</li>
        <li>Factory</li>
        <li>Delegate</li>
        <li>Decorator</li>
        <li>Composite</li>
        <li>Flyweight</li>
    </ul>
</div>

<div class="slide">
    <h1>Singleton</h1>

    <pre class="brush: js">
        // Simple sample
        var mySingleton = {
            property1:"something",
            property2:"something else",
            method1:function(){
                console.log('hello world');
            }
        };
    </pre>
</div>

<div class="slide">
    <h1>Singleton</h1>


    <div style="font-size: 70%">
        <pre class="brush: js">
            // complex sample with private state
            var mySingleton = function(){

                // private members
                var privateVariable = 'something private';

                function showPrivate(){
                    alert(privateVariable);
                }

                // public members
                return {
                    publicVar:'the public can see this!'
                    publicMethod:function(){
                        showPrivate();
                    },
                };
            }();
        </pre>
    </div>
</div>

<div class="slide">
    <h1>Factory</h1>

    <div style="font-size: 80%">
        <pre class="brush: js">
            var Car = (function() {
                var Car = function (model, year, miles){
                    this.model = model;
                    this.year   = year;
                    this.miles = miles;
                };

                return function (model, year, miles) {
                    return new Car(model, year, miles);
                };
            })();

            var civic = new Car("Honda Civic", 2009, 20000);
            var mondeo = Car("Ford Mondeo", 2010, 5000);
        </pre>
    </div>
</div>

<div class="slide">
    <h1>Decorator</h1>

    <img src="graphics/OOP/pattern-decorator-uml.png" alt="" style="margin-top: 1em;">
</div>

<div class="slide">
    <h1>Decorator</h1>

    <img src="graphics/OOP/pattern-decorator-lepus.png" alt="" style="margin-top: 1em;">
</div>

<div class="slide">
    <h1>Decorator</h1>

    <div style="font-size: 50%">
        <pre class="brush: js">
            // ConcreteComponent (класс для последующего декорирования)
            function Coffee() {
                this.cost = function() { return 1; };
            }

            function Milk(coffee) { // Decorator A
                this.cost = function() { return coffee.cost() + 0.5; };
            }

            function Whip(coffee) { // Decorator B
                this.cost = function() { return coffee.cost() + 0.7; };
            }

            function Sprinkles(coffee) { // Decorator C
                this.cost = function() { return coffee.cost() + 0.2; };
            }

            var coffee = new Coffee();
            coffee = new Sprinkles(coffee);
            coffee = new Whip(coffee);
            coffee = new Milk(coffee);
            alert(coffee.cost());
        </pre>
    </div>
</div>


<div class="slide">
    <h1>Composite</h1>
</div>

<div class="slide">
    <h1>Flyweight</h1>
</div>

<!-- OOP -->
<div class="slide">
    <h1>Content</h1>

    <ul class="content">
        <li class="done">Inheritance Problems and Solutions</li>
        <li class="done">Functional Programing in JS</li>
        <li class="done">Design Patterns</li>
        <li class="current">OOP Principals</li>
    </ul>
</div>

<div class="slide">
    <h1>Current State of Languages Index</h1>

    <table align="center" style="font-size:90%; padding: 0; line-height: 1em; border: 0;" cellpadding="0" cellspacing="0">
        <colgroup>
            <col align="center" />
            <col/>
            <col align="center" />
        </colgroup>
        <tbody>
            <tr>
                <th align="center">&#160;</th>
                <th align="left">Language</th>
                <th align="left">Ratings Oct 2011</th>
            </tr>
            <tr>
                <td align="center">1</td>
                <td>Java</td>
                <td align="center">17.913%</td>
            </tr>
            <tr>
                <td align="center">2</td>
                <td>C</td>
                <td align="center">17.707%</td>
            </tr>
            <tr>
                <td align="center">3</td>
                <td>C++</td>
                <td align="center">9.072%</td>
            </tr>

            <tr>
                <td align="center">4</td>
                <td>PHP</td>
                <td align="center">6.818%</td>
            </tr>

            <tr>
                <td align="center">5</td>
                <td>C#</td>
                <td align="center">6.723%</td>
            </tr>

            <tr>
                <td align="center">6</td>
                <td>Objective-C</td>
                <td align="center">6.245%</td>
           </tr>

            <tr>
                <td align="center">7</td>
                <td>(Visual) Basic</td>
                <td align="center">4.549%</td>
            </tr>

            <tr>
                <td align="center">8</td>
                <td>Python</td>
                <td align="center">3.944%</td>
            </tr>

            <tr>
                <td align="center">9</td>
                <td>Perl</td>
                <td align="center">2.432%</td>
            </tr>

            <tr>
                <td align="center">10</td>
                <td>JavaScript</td>
                <td align="center">2.191%</td>
            </tr>
        </tbody>
    </table>
</div>

<div class="slide">
    <h1>Current State of Languages Index</h1>

    <table align="center" style="font-size:90%; padding: 0; line-height: 1em; border: 0;" cellpadding="0" cellspacing="0">
        <colgroup>
            <col align="center" />
            <col/>
            <col align="center" />
        </colgroup>
        <tbody>
            <tr>
                <th align="center">&#160;</th>
                <th align="left">Language</th>
                <th align="left">Ratings Oct 2011</th>
                <th align="left">Paradigm</th>
            </tr>
            <tr>
                <td align="center">1</td>
                <td>Java</td>
                <td align="center">17.913%</td>
                <td>OOP</td>
            </tr>
            <tr>
                <td align="center">2</td>
                <td>C</td>
                <td align="center">17.707%</td>
                <td>Procedural</td>
            </tr>
            <tr>
                <td align="center">3</td>
                <td>C++</td>
                <td align="center">9.072%</td>
                <td>Procedural, OOP</td>
            </tr>

            <tr>
                <td align="center">4</td>
                <td>PHP</td>
                <td align="center">6.818%</td>
                <td>Procedural, OOP</td>
            </tr>

            <tr>
                <td align="center">5</td>
                <td>C#</td>
                <td align="center">6.723%</td>
                <td>Procedural, OOP</td>
            </tr>

            <tr>
                <td align="center">6</td>
                <td>Objective-C</td>
                <td align="center">6.245%</td>
                <td>Procedural, OOP</td>
           </tr>

            <tr>
                <td align="center">7</td>
                <td>(Visual) Basic</td>
                <td align="center">4.549%</td>
                <td>Procedural, OOP</td>
            </tr>

            <tr>
                <td align="center">8</td>
                <td>Python</td>
                <td align="center">3.944%</td>
                <td>Procedural, OOP</td>
            </tr>

            <tr>
                <td align="center">9</td>
                <td>Perl</td>
                <td align="center">2.432%</td>
                <td>Procedural, OOP</td>
            </tr>

            <tr>
                <td align="center">10</td>
                <td>JavaScript</td>
                <td align="center">2.191%</td>
                <td>Procedural, OOP</td>
            </tr>
        </tbody>
    </table>
</div>

<div class="slide">
    <h1>Current State of Languages Index</h1>

    <table align="center" style="font-size:90%; padding: 0; line-height: 1em; border: 0;" cellpadding="0" cellspacing="0">
        <colgroup>
            <col align="center" />
            <col/>
            <col align="center" />
        </colgroup>
        <tbody>
            <tr>
                <th align="center">&#160;</th>
                <th align="left">Language</th>
                <th align="left">Ratings Oct 2011</th>
                <th align="left">Paradigm</th>
            </tr>
            <tr>
                <td align="center">1</td>
                <td>Java</td>
                <td align="center">17.913%</td>
                <td>Classes</td>
            </tr>
            <tr>
                <td align="center">2</td>
                <td>C</td>
                <td align="center">17.707%</td>
                <td>Procedural</td>
            </tr>
            <tr>
                <td align="center">3</td>
                <td>C++</td>
                <td align="center">9.072%</td>
                <td>Classes</td>
            </tr>

            <tr>
                <td align="center">4</td>
                <td>PHP</td>
                <td align="center">6.818%</td>
                <td>Classes</td>
            </tr>

            <tr>
                <td align="center">5</td>
                <td>C#</td>
                <td align="center">6.723%</td>
                <td>Classes</td>
            </tr>

            <tr>
                <td align="center">6</td>
                <td>Objective-C</td>
                <td align="center">6.245%</td>
                <td>Classes?</td>
           </tr>

            <tr>
                <td align="center">7</td>
                <td>(Visual) Basic</td>
                <td align="center">4.549%</td>
                <td>Classes</td>
            </tr>

            <tr>
                <td align="center">8</td>
                <td>Python</td>
                <td align="center">3.944%</td>
                <td>Classes</td>
            </tr>

            <tr>
                <td align="center">9</td>
                <td>Perl</td>
                <td align="center">2.432%</td>
                <td>Classes</td>
            </tr>

            <tr>
                <td align="center">10</td>
                <td>JavaScript</td>
                <td align="center">2.191%</td>
                <td>Prototype</td>
            </tr>
        </tbody>
    </table>
</div>

<div class="slide">
    <h1>Dominate Paradigm</h1>

    <ul>
        <li>Object-Oriented Languages (55.9%)</li>
        <li>Procedural Languages (38.0%)</li>
        <li>Functional Languages (4.1%)</li>
        <li>Logical Languages (2.0%)</li>
    </ul>
</div>

<div class="slide">
    <h1>Object-Oriented Programming</h1>

    <ul>
        <li>Парадигма программирования, в которой основными концепциями являются понятия объектов и классов. (wiki)</li>
        <li>Классы и объекты (инкапсуляция, наследование, полиморфизм) и т.п.</li>
        <li>Технология программирования, основанная на моделировании реального мира, при котором детали его реализации скрыты; либо взгляд на программирование, основанный на данных, в котором данные и поведение жестко связаны.</li>
    </ul>
</div>

<div class="slide">
    <h1>Where are my classes?</h1>

    <img src="images/classes.jpg" alt="classes" style="margin-left: 50%; margin-right: 50%;" />
</div>

<div class="slide">
    <h1>jQuery, Mootools...</h1>

    <pre class="brush: js">
        var Animal = Class.create({
          initialize: function(name, sound) {
            this.name  = name;
            this.sound = sound;
          },

          speak: function() {
            alert(this.name + " says: " + this.sound + "!");
          }
        });
    </pre>
</div>

<div class="slide">
    <h1>jQuery, Mootools...</h1>

    <div>
        <pre class="brush: js">
            var Cat = new Class({
                initialize: function(name){
                    this.name = name;
                }
            });
            var myCat = new Cat('Micia');
        </pre>
    </div>
</div>

<div class="slide">
    <h1>But why we <b>really</b> need classes?</h1>
</div>

<div class="slide">
    <h1>Object-Oriented Programming</h1>

    <p>По мнению Алана Кея:</p>
    <ul>
        <li>Всё является объектом.</li>
        <li>Вычисления осуществляются путём взаимодействия между объектами.</li>
        <li>Объекты взаимодействуют, посылая и получая сообщения</li>
        <li>Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия</li>
    </ul>

    <p class="incremental">Разработал язык программирования Smalltalk, где впервые был применен объектно-ориентированный подход</p>
</div>

<div class="slide">
    <h1>Серебрянной пули нет</h1>

    <p>Ни в одной технологии или в управленческой технике не существует универсального метода, увеличивающего на порядок производительность, надёжность и простоту.</p>

    <a href="http://ru.wikipedia.org/wiki/Серебряной_пули_нет" rel="nofollow" target="_blank">Серебрянной пули нет</a>
</div>

<div class="slide">
    <h1>ООП Провалилось</h1>

    <p><a href="http://blogerator.ru/page/oop_why-objects-have-failed" rel="nofollow">Почему объектно-ориентированное программирование провалилось?</a></p>

    <p>Половена всех концепций ООП является скорей плохими, чем хорошими, тогда как вторя пловина и вовсе не имеет никакого отношения к ООП. Пол Грэм</p>
</div>

<div class="slide">
    <h1>ООП Провалилось</h1>

    <p>Алан Кей: Я придумал термин «объектно-ориентированный», и вот что я вам скажу, я не имел ввиду С++. (OOPSLA '97)</p>

    <p>Дизайн Smalltalk — и его существование вообще — обусловлен тем, что все, что мы можем описать, возможно представить рекурсивной композицией отдельных видов поведенческих строительных блоков, которые внутри самих себя скрывают свою текущую комбинацию состояния и процессов, и могут взаимодействовать друг с другом только посредством обмена сообщениями. (The History Of Smalltalk)</p>
</div>
<div class="slide">
    <h1>ООП Провалилось</h1>

    <p>Я уверен, что ООП методологически неверна. Она начинает с построения классов. Это как если бы математики начинали бы с аксиом. Но реально никто не начинает с аксиом... (<a href="http://en.wikipedia.org/wiki/Alexander_Stepanov" title="A.Stepanov in wiki" target="_blank">Александр Степанов (Соучастник создания С++, создатель STL)</a>)</p>
</div>

<div class="slide">
    <h1>Вопросы / Предложения</h1>

    <ul>
        <li>Alex.Kolonitsky@gmail.com</li>
        <li>akolonitsky@exadel.com</li>
        <li>Skype: Desargues_</li>
        <li>http://code.google.com/p/javascript-learning-courses/issues/list</li>
    </ul>
</div>

<div class="slide">
    <h1>Links</h1>

    <ul>
        <li><a href="http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth" rel="nofollow" target="_blank">JavaScript Module Pattern In Depth</a></li>
        <li><a href="http://addyosmani.com/resources/essentialjsdesignpatterns/book/" rel="nofollow" target="_blank">Essential JavaScript Design Patterns For Beginners, Volume 1.</a></li>
        <li><a href="http://rsdn.ru/res/book/oo/design_patterns.xml" rel="nofollow" target="_blank">Приемы объектно-ориентированного проектирования. Паттерны проектирования.</a></li>
    </ul>
</div>

</body>
</html>
